Ticket #2233: RE sofqw.txt

File RE sofqw.txt, 15.3 KB (added by Nick Draper, 10 years ago)
Line 
1From:   Taylor, Jon (STFC,RAL,ISIS)
2Sent:   11 January 2011 14:58
3To:     Draper, Nick (-,RAL,ISIS)
4Subject:        RE: sofqw
5
6Follow Up Flag: Follow up
7Flag Status:    Flagged
8
9hi
10the lamp routine is below, its in the lamp macro language... enjoy
11cheers
12Jon
13;-----------------------------------------------------------------------------
14---
15;*****************************************************************************
16***
17;
18 FUNCTION sqw_rebin, w_in, dQ = dQ, Emin = Emin0, all_angles = all_angles, $
19   pos_angles = pos_angles, neg_angles = neg_angles, $
20   swap_QE = swap_QE, qb, em, ib
21;
22; For IN4, IN5, IN6, BRISP and D7
23;
24;rebins output data from t2e and reb to regular-grid S(Q,w) data using the old
25;KHA IN6 rebin algorithm. Proper rebionning routine with error analysis
26(unlike
27;sqw_interp.pro).
28;
29;ARGUMENTS:
30; dQ : Q bin width
31; Emin0: Minimum energy value (meV) - neutron energy gain is negative
32;
33;KEYWORDS (- only for D7 data)
34; /neg_angles : use only negative angles
35; /pos_angles : use only positive angles
36; /all_angles : use all angles (default)
37;  input workspace must be in energy transfer versus scattering angle,
38;  i.e. only one component or spin phase.
39; (qb, em and ib are obsolete, kept for backwards compatibility)
40;
41;DIMENSIONS:
42; w_in(nE,nphi) -> w_out(nQs,nEs)
43;
44;COMMAND SYNTAX:
45; w10=spw_rebin(w9,dQ=<dQ>,
46Emin=<Emin>[,/neg_angles][,/pos_angles][,/all_angles])
47;
48; (optional keywords shown in square brackets)
49;
50;       KHA,JRS 9/02/06
51;-----------------------------------------------------------------------------
52---
53;*****************************************************************************
54***
55 common c_lamp_access, inst
56 common grid, Qmin, Qmax, Emin, Emax
57 iprint = 0 ; if iprint>0, show debugging messages
58 IF iprint THEN PRINT,'Start sqw_rebin:'
59 take_datp, datp
60 ibank = 2
61 IF N_ELEMENTS(qb) GT 0 THEN dQ    = qb
62 IF N_ELEMENTS(em) GT 0 THEN Emin  = em
63 IF N_ELEMENTS(ib) GT 0 THEN ibank = ib
64 IF KEYWORD_SET(pos_angles) THEN ibank   = 1
65 IF KEYWORD_SET(neg_angles) THEN ibank   = 0
66 IF KEYWORD_SET(all_angles) THEN ibank   = 2
67 IF KEYWORD_SET(swap_QE)    THEN swap_QE = 1 ELSE swap_QE = 0
68 no_small = 0
69 IF (datp.y(0) GT 10.) AND (inst EQ 'IN4') THEN BEGIN
70  no_small = 1
71  PRINT, 'SQW_rebin: IN4 data without small angle bank'
72 ENDIF
73;-----------------------------------------------------------------------------
74--
75;Set up starting parameters
76 IF N_ELEMENTS(dQ) NE 1 THEN BEGIN
77  ii = WIDGET_MESSAGE('SQW_rebin: Error - dQ must be specified', /ERROR)
78  RETURN, w_in
79 ENDIF
80 
81 IF N_ELEMENTS(Emin0) NE 1 THEN Emin0=-1.E+10
82 sw = SIZE(w_in)
83 IF iprint THEN PRINT,'SIZE(w_in) = ',sw
84 
85 IF sw(0) NE 2 THEN BEGIN
86  s = 'SQW_rebin: Error - input workspace must be 2-D: E vs. phi'
87  ii = WIDGET_MESSAGE(s, /ERROR)
88  RETURN, w_in
89 ENDIF
90 
91 nx = sw(1)
92 ny = sw(2)
93 IF iprint THEN PRINT,'nx=',nx,' ny=',ny
94 x_in = datp.x & sx = SIZE(x_in)
95 y_in = datp.y & sy = SIZE(y_in)
96 IF (nx NE sx(1)) OR (ny NE sy(1)) THEN BEGIN
97  s = 'SQW_rebin: sx = ' + STRTRIM(STRING(sx),2) + $
98                              ' sy = ' + STRTRIM(STRING(sy),2)
99  ii = WIDGET_MESSAGE(s, /ERROR)
100  RETURN, w_in
101 ENDIF
102 e_in = datp.e
103 se   = SIZE(e_in)
104 IF (se(0) NE sw(0) OR se(1) NE sw(1) OR se(2) NE sw(2)) THEN e_in=w_in*0.
105 par=datp.p
106 IF iprint THEN PRINT,'Instrument = ',inst
107 IF (inst EQ 'D7') THEN lambda = par(4) ELSE lambda = par(21)
108 IF iprint THEN PRINT,'lambda = ',lambda,'A'
109;-----------------------------------------------------------------------------
110--------
111; Set constants and prepare arrays for rebinning to regular Q-E grid
112 const1 = 5.22697  ; E(meV)  = const1*V(m/ms)^2
113 const2 = 2.07193571  ; E(meV)  = const2*k(A^-1)^2
114 const3 = 3.956076  ; V(m/ms) = const3/lambda(A)
115 const4 = 81.8066  ; E(meV)  = const4/lambda(A)^2
116 Ei   = const4 / lambda^2
117 ki   = SQRT(Ei / const2)
118 y_in = y_in*!pi/180. ; convert to radians
119 nEps = nx + 1
120        Eps  = FLTARR(nEps)
121 Eps(0)      =  x_in(0) - (x_in(1) - x_in(0)) / 2.
122 Eps(1:nx-1) = (x_in(0:nx - 2) + x_in(1:nx - 1)) / 2.
123 Eps(nx)     =  x_in(nx - 1) + (x_in(nx - 1) - x_in(nx - 2)) / 2.
124 iEarr = WHERE(x_in GT Emin0)
125 Eps   = Eps(iEarr(0):nx)
126 nEps  = nx - iEarr(0) + 1
127 Emin  = Eps(0)
128 Emax  = Eps(nEps - 1)
129 Qmin  = 0
130 max_y = MAX(y_in)
131 Qmax = SQRT((2.*Ei - Emin - 2.*SQRT(Ei*(Ei - Emin))*COS(max_y))/const2)
132 Qmax=MAX([Qmax,ki])
133 IF iprint THEN PRINT,'x        = ',x_in
134 IF iprint THEN PRINT,'iEarr(0) = ',iEarr(0),' nx = ',nx
135 IF iprint THEN PRINT,'Emin     = ',Emin,' Emax=',Emax,' meV'
136 IF iprint THEN PRINT,'Eps      = ',Eps
137 IF iprint THEN PRINT,'SQW_rebin: E-array prepared'
138;-----------------------------------------------------------------------------
139;angle grid generation
140 nQ    = FIX((Qmax - Qmin) / dQ) + 1
141 w_out = FLTARR(nQ,nEps)
142 e_out = w_out - 1.
143 Q     = Qmin + FLOAT(INDGEN(nQ))*dQ
144 IF iprint THEN PRINT,'Qmin = ', Qmin
145 IF iprint THEN PRINT,'Qmax = ', Qmax
146 IF iprint THEN PRINT,'nQ   = ', nQ
147 IF iprint THEN PRINT,'Q    = ', Q
148 IF iprint THEN PRINT,'y_in = ', y_in*180./!pi
149 IF inst EQ 'D7' THEN BEGIN
150  isort = SORT(y_in)
151  y_buf1 = y_in(isort)
152  w_buf1 = w_in(*,isort)
153  e_buf1 = e_in(*,isort)
154  i     = WHERE(y_buf1 GT 0.,n)
155 
156  IF ibank EQ 2 THEN BEGIN
157   twice = 1
158   iphi1 = 0  & iphi1next = i(0)
159   iphi2 = i(0) - 1 & iphi2next = ny - 1
160  ENDIF ELSE BEGIN
161   twice = 0
162   IF ibank EQ 0 THEN BEGIN
163    iphi1 = 0
164    iphi2 = i(0) - 1
165   ENDIF ELSE IF ibank EQ 1 THEN BEGIN
166    iphi1 = i(0)
167    iphi2 = ny - 1
168   ENDIF
169  ENDELSE
170 ENDIF ELSE BEGIN
171  twice = 0
172  iphi1 = 0 & iphi2 = ny - 1
173 ENDELSE
174 IF iprint THEN PRINT,'twice=',twice,' iphi1=',iphi1,' iphi2=',iphi2
175start:
176 IF inst EQ 'D7' THEN BEGIN
177  nphi          = iphi2 - iphi1 + 2
178  phi           = FLTARR(nphi)
179  phi(0)        = y_buf1(iphi1) - (y_buf1(iphi1 + 1) - y_buf1(iphi1)) / 2.
180  phi(1:nphi-2) = (y_buf1(iphi1:iphi2 - 1) + y_buf1(iphi1 + 1:iphi2)) / 2.
181  phi(nphi-1)   = y_buf1(iphi2) + (y_buf1(iphi2) - y_buf1(iphi2 - 1))/2.
182  w_buf = w_buf1(iEarr,iphi1:iphi2)
183  e_buf = e_buf1(iEarr,iphi1:iphi2)
184  y_buf = y_buf1(iphi1:iphi2)
185 ENDIF ELSE IF (inst EQ 'IN4') AND (NOT no_small)  THEN BEGIN
186  nphi          = ny+2
187  phi           = FLTARR(nphi)
188  IF iprint THEN PRINT,'y_in=',y_in*180./!pi
189  i1=(WHERE(y_in GT 10.*!pi/180.))(0)-1
190  phi(0)    = y_in(0) - (y_in(1) - y_in(0)) / 2.
191  phi(1:i1) = (y_in(0:i1-1)+y_in(1:i1))/2.
192  phi(i1+1) = phi(i1)+(y_in(i1)-y_in(i1-1))
193  phi(i1+3:nphi-2) = (y_in(i1+1:ny-2)+y_in(i1+2:ny-1))/2.
194  phi(i1+2) = phi(i1+3)-(y_in(i1+2)-y_in(i1+1))
195  phi(nphi-1) = phi(nphi-2)+(y_in(ny-1)-y_in(ny-2))
196  w_buf = [[w_in(iEarr,0:i1)],[0.*iEarr],[w_in(iEarr,i1+1:ny-1)]]
197  e_buf = [[e_in(iEarr,0:i1)],[0.*iEarr-1.],[e_in(iEarr,i1+1:ny-1)]]
198  y_buf = (phi(0:nphi-2)+phi(1:nphi-1))/2.
199  IF iprint THEN PRINT,' phi =',phi*180./!pi
200  IF iprint THEN FOR i=0,50 DO PRINT, i, phi(i)*180./!pi, y_in(i)*180./!pi
201 ENDIF ELSE BEGIN
202  nphi          = iphi2 - iphi1 + 2
203  phi           = FLTARR(nphi)
204  phi(0)        = y_in(iphi1) - (y_in(iphi1 + 1) - y_in(iphi1)) / 2.
205  phi(1:nphi-2) = (y_in(iphi1:iphi2 - 1) + y_in(iphi1 + 1:iphi2)) / 2.
206  phi(nphi-1)   = y_in(iphi2) + (y_in(iphi2) - y_in(iphi2 - 1))/2.
207  w_buf = w_in(iEarr,iphi1:iphi2)
208  e_buf = e_in(iEarr,iphi1:iphi2)
209  y_buf = y_in(iphi1:iphi2)
210 ENDELSE
211 COSphi        = COS(phi)
212 
213; reverse array direction for negative angles
214 IF phi(0) LT 0. THEN BEGIN
215  w_buf =     REVERSE(w_buf,2)
216  e_buf =     REVERSE(e_buf,2)
217  y_buf = ABS(REVERSE(y_buf))
218  phi   = ABS(REVERSE(phi))
219  COSphi=     REVERSE(COSphi)
220 ENDIF
221 IF iprint THEN PRINT,'phi=',phi*180./!pi
222 IF iprint THEN PRINT,'End of "prepare angle arrays" section'
223;-----------------------------------------------------------------------------
224--------
225; Rebin angles to constant Q grid
226 a       = const2   ; E(meV)=a*Q(A**-1)**2
227 iprint0 = iprint
228 oldymin = 0.
229 IF iprint THEN BEGIN
230  b=''
231  PRINT,'About to start rebinning. Hit return to continue'
232  READ, b
233 ENDIF
234 FOR iQ = 0,nQ - 1 DO BEGIN
235  Qmin = Q(iQ) - (dQ / 2.)
236  Qmax = Q(iQ) + (dQ / 2.)
237  Q00  = [Qmin, Qmin, Qmax, Qmax]
238  FOR iEps = 0, nEps - 2 DO BEGIN
239   Emin     = Eps(iEps)
240   Emax     = Eps(iEps + 1)
241   corrarea = dQ*(Emax - Emin)
242   Eps0     = [Emin, Emax, Emax, Emin]
243   COSphi0  = (2.*Ei - Eps0 - a*Q00^2) / (2.*SQRT(Ei*(Ei - Eps0)))
244   IF MAX(ABS(COSphi0)) GE 1. THEN GOTO, outside
245   phi0     = ACOS(COSphi0)
246   phimin   = MIN(phi0)
247   phimax   = MAX(phi0)
248   IF (phimax LT phi(0)) OR (phimin GT phi(nphi-1)) THEN GOTO, outside
249   iphi     = WHERE(phi GT phimin AND phi LT phimax, nlines)
250   iphi0    = (iphi(0) - 1) > 0
251   IF nlines EQ 0 THEN BEGIN
252    phimean = (phimin + phimax) / 2.
253    ip      = WHERE(phi LT phimean, np)
254    iphi0   = ip(np - 1)
255   ENDIF
256startrebin:  Areasum    = 0.
257   wsum       = 0.
258   e2sum      = 0.
259   phiminmeas = 7.
260   phimaxmeas = 0.
261   FOR iphi = iphi0,(iphi0 + nlines) < (nphi - 2) DO BEGIN
262    COSphi1 = COSphi(iphi)
263    COSphi2 = COSphi(iphi + 1)
264    COSphi0 = [COSphi1, COSphi1, COSphi2, COSphi2]
265    Q0      = SQRT((2.*Ei - Eps0 - 2.*SQRT(Ei*(Ei - Eps0))*COSphi0)/a)
266    area    = OVERLAP(Q0, Eps0, iprint, oldymin)
267    IF area GT 0. THEN BEGIN
268     w = w_buf(iEps,iphi)
269     e = e_buf(iEps,iphi)
270     IF (w NE 0.) OR (e GE 0.) THEN BEGIN
271      areasum    = areasum + area
272      wsum       = wsum + area*w
273      e2sum      = e2sum + (area*e)^2
274      phiminmeas = phiminmeas < phi(iphi)
275      phimaxmeas = phimaxmeas > phi(iphi + 1)
276     ENDIF
277    ENDIF
278   ENDFOR
279   IF areasum NE 0. THEN BEGIN
280    w_out(iQ,iEps) = wsum / areasum
281    e_out(iQ,iEps) = SQRT(e2sum) / areasum
282    GOTO, binned
283   ENDIF
284outside:  w_out(iQ,iEps) =  0.
285   e_out(iQ,iEps) = -1.
286   GOTO, nextpoint
287binned:
288   p1 = phimin > phiminmeas
289   p2 = phimax < phimaxmeas
290   IF p2 - p1 LT (phimax - phimin)/2. THEN BEGIN
291    w_out(iQ,iEps) =  0.
292    e_out(iQ,iEps) = -1.
293   ENDIF
294nextpoint:
295  ENDFOR
296 ENDFOR
297 iprint = iprint0
298 IF iprint THEN PRINT,'End of rebinning'
299 IF twice THEN BEGIN
300  IF (iphi1 EQ 0) THEN BEGIN
301   w_out1 = w_out
302   e_out1 = e_out
303   iphi1  = iphi1next
304   iphi2  = iphi2next
305   GOTO, start
306  ENDIF ELSE BEGIN
307;take weighted averages of negative and positive banks for D7
308   w_out2 = w_out
309   e_out2 = e_out
310   w_out  = 0.
311   e_out  = 0.
312   not1   = WHERE(e_out1 LE 0.,n1)
313   IF n1 NE 0 THEN e_out1(not1) = 1.
314   not2   = WHERE(e_out2 LE 0.,n2)
315   IF n2 NE 0 THEN e_out2(not2) = 1.
316   w_out = (w_out1/e_out1^2 + w_out2/e_out2^2) / (1./e_out1^2 + 1./e_out2^2)
317   e_out = 1./SQRT(1./e_out1^2 + 1./e_out2^2)
318   IF n1 NE 0 THEN e_out1(not1) = -1.
319   IF n2 NE 0 THEN e_out2(not2) = -1.
320   IF n1 NE 0 THEN BEGIN
321    w_out(not1) = w_out2(not1)
322    e_out(not1) = e_out2(not1)
323   ENDIF
324   IF n2 NE 0 THEN BEGIN
325    w_out(not2) = w_out1(not2)
326    e_out(not2) = e_out1(not2)
327   ENDIF
328  ENDELSE
329 ENDIF
330 IF iprint THEN PRINT,'End of rebinning section'
331;-----------------------------------------------------------------------------
332--------
333;Chop off superfluous bits
334 i = WHERE(e_out GT -1.,n)
335 IF iprint THEN PRINT, n, ' non-zeroed points'
336checkQ2:
337 iw0 = WHERE(w_out(nQ - 1,*) EQ  0., nw0)
338 ie0 = WHERE(e_out(nQ - 1,*) EQ -1., ne0)
339 IF (nw0 EQ nEps) AND (ne0 EQ nEps) THEN BEGIN
340  nQ    = nQ - 1
341  w_out = w_out(0:nQ - 1,*)
342  e_out = e_out(0:nQ - 1,*)
343  Q     = Q(0:nQ - 1)
344  GOTO, checkQ2
345 ENDIF
346checkEps1:
347 iw0 = WHERE(w_out(*,0) EQ  0., nw0)
348 ie0 = WHERE(e_out(*,0) EQ -1., ne0)
349 IF (nw0 EQ nQ) AND (ne0 EQ nQ) THEN BEGIN
350  nEps  = nEps - 1
351  w_out = w_out(*,1:nEps)
352  e_out = e_out(*,1:nEps)
353  Eps   = Eps(1:nEps)
354  GOTO, checkEps1
355 ENDIF
356checkEps2:
357 iw0 = WHERE(w_out(*,nEps - 1) EQ  0., nw0)
358 ie0 = WHERE(e_out(*,nEps - 1) EQ -1., ne0)
359 IF (nw0 EQ nQ) AND (ne0 EQ nQ) THEN BEGIN
360  nEps  = nEps - 1
361  w_out = w_out(*,0:nEps - 1)
362  e_out = e_out(*,0:nEps - 1)
363  Eps   = Eps(0:nEps - 1)
364  GOTO, checkEps2
365 ENDIF
366 IF iprint THEN PRINT,'End of chopping section'
367;-----------------------------------------------------------------------------
368--------
369;Return parameters and exit
370 IF NOT swap_QE THEN BEGIN
371  datp.y_tit = datp.x_tit
372  datp.x_tit = 'Wavevector Transfer (A!U-1!N)'
373  MOD_DATP, datp, "x", Q
374  MOD_DATP, datp, "y", x_in(iEarr)
375 ENDIF ELSE BEGIN
376  w_out      = TRANSPOSE(w_out)
377  e_out      = TRANSPOSE(e_out)
378  datp.y_tit = 'Wavevector Transfer (A!U-1!N)'
379  MOD_DATP, datp, "x", x_in(iEarr)
380  MOD_DATP, datp, "y", Q
381 ENDELSE
382 MOD_DATP, datp, "e", e_out
383 PRINT, FORMAT = '("Sqw_Rebin: Rebinned to constant Q-w: dQ=",F4.2," A-1")',
384dQ
385 s = STRTRIM(STRING(FLOAT(dQ)),2) & dQ = string_round(s)
386 s = ' -sr(dQ=' + dQ
387 IF Emin0 GT -9.E+09 THEN BEGIN
388  Emin = STRTRIM(STRING(FIX(Emin0)),2)
389  s = s + ',emin='+Emin
390 ENDIF
391 CASE ibank OF
392  0: bs = '/neg)'
393  1: bs = '/pos)'
394  2: bs = '/all)'
395 ENDCASE
396 IF inst EQ 'D7' THEN s = s + bs ELSE s = s + ')'
397 datp.other_tit = datp.other_tit + s
398 GIVE_DATP, datp
399finished:
400 RETURN, w_out
401 END
402
403________________________________________
404From: Draper, Nick (-,RAL,ISIS) [nick.draper@stfc.ac.uk]
405Sent: 11 January 2011 13:34
406To: Taylor, Jon (STFC,RAL,ISIS)
407Subject: RE: sofqw
408Jon,
409Thanks for this.  I was right on the phone when I said that this had been
410created for indirect instruments where they have so much less data that it is
411hard to spot any effect of this bug.
412I'll raise a ticket to look at the lack of curvature on the lower boundary
413(http://trac.mantidproject.org/mantid/ticket/2214).  If you can drag anything
414out from lamp that would be appreciated for the rebinning.
415For swapping the axes you could try the Transpose algorithm.
416Regards,
417Nick Draper
418
419-----Original Message-----
420From: Taylor, Jon (STFC,RAL,ISIS)
421Sent: 11 January 2011 11:39
422To: Draper, Nick (-,RAL,ISIS)
423Subject: sofqw
424hi
425I've attached a pic of what mslice produces for modQ for MARI and the output
426from the sofqw algorithm. at low Q one should see a curved trajectory for the
427detector group rather than a horizontal one.
428Do you know if its possible to rotate the axis in mantid plot (a minor niggle)
429the rebin is a finer correction as for a fist approximation a simple rebin
430works OKish i will dig the ILL code from lamp out which does the full
431treatment.
432cheers
433jon
434
435
436________________________________________
437From: Draper, Nick (-,RAL,ISIS) [nick.draper@stfc.ac.uk]
438Sent: 11 January 2011 13:34
439To: Taylor, Jon (STFC,RAL,ISIS)
440Subject: RE: sofqw
441
442Jon,
443
444Thanks for this.  I was right on the phone when I said that this had been
445created for indirect instruments where they have so much less data that it is
446hard to spot any effect of this bug.
447
448I'll raise a ticket to look at the lack of curvature on the lower boundary
449(http://trac.mantidproject.org/mantid/ticket/2214).  If you can drag anything
450out from lamp that would be appreciated for the rebinning.
451
452For swapping the axes you could try the Transpose algorithm.
453
454Regards,
455Nick Draper
456
457
458-----Original Message-----
459From: Taylor, Jon (STFC,RAL,ISIS)
460Sent: 11 January 2011 11:39
461To: Draper, Nick (-,RAL,ISIS)
462Subject: sofqw
463
464hi
465I've attached a pic of what mslice produces for modQ for MARI and the output
466from the sofqw algorithm. at low Q one should see a curved trajectory for the
467detector group rather than a horizontal one.
468Do you know if its possible to rotate the axis in mantid plot (a minor niggle)
469the rebin is a finer correction as for a fist approximation a simple rebin
470works OKish i will dig the ILL code from lamp out which does the full
471treatment.
472cheers
473jon